1.获取上传的文件

# app.py

from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file') # 获取上传文件
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()

2.获取上传文件的文件名+后缀

  • .filename

# app.py

from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file')
        file_name = file_obj.filename # 获取文件名 + 后缀
# 等价于
        file_name = request.files.get('img_file').filename # 获取文件名 + 后缀
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()

3.获取上传文件的大小

# app.py

from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file')
        bytes_file_content = file_obj.read()  # 读取上传文件的bytes类型的内容 -> b'\xff\xd8\xff\xe0\x00\x……
        byte_size = len(bytes_file_content)  # 7634760 byte
        kb_size = byte_size / 1024  # 7455.8 kb
        mb_size = byte_size / 1024 / 1024  # 7.28 mb
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()

4.限制上传文件的大小

  • 如果上传的文件超出所限制的文件大小,那么就会返回一个 413 状态码

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码

5. 获取文件流

  • .stream -> stream 就是“流”的意思

  • 文件流有点类似于文件句柄,可以循环着保存数据

# app.py

from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file')
file_stream = file_obj.stream # 获取文件流
        for line in file_stream:
            print(line)  # b'\xd8\xa9\n……'
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()

6.保存上传文件

  • 语法: .save('/保存的路径/保存的文件名.后缀名')

  • 注意: .save() 方法所接收的路径格式是: 所要保存到那个路径 + 文件名.后缀名 -> 文件是什么那么保存的时候文件名就是什么

  • 写法一

# app.py

from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file')
        file_name = file_obj.filename
file_obj.save('files/' + file_name) # 保存文件 -> 注意: 如果是当前项目的文件夹,那么路径开头不能加 /
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()

  • 写法二 -> 推荐使用

# app.py

import os
from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file')
        file_name = file_obj.filename
        path = os.path.join('files', file_name)  # 拼接保存文件的路径 -> 注意: 如果是当前项目的文件夹,那么路径开头不能加 /
file_obj.save(path) # 保存文件
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()

7. 自定义保存上传文件

  • 不使用 .save() 保存文件,获取文件流自己保存上传文件

# app.py

import os
from flask import Flask, render_template, request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制只允许上传 16MB 大小以内的文件, 如果超过此设置的大小就会返回一个 413 状态码


@app.route('/upload_files', methods=['GET', 'POST'])
def upload_files():
    if request.method == 'POST':
        file_obj = request.files.get('img_file')
        file_stream = file_obj.stream  # 获取文件流
        path = os.path.join('files', file_obj.filename)  # 拼接保存文件的路径 -> 注意: 如果是当前项目的文件夹,那么路径开头不能加 /
        with open(path, mode='wb') as f:
            for line in file_stream:
                f.write(line)
    return render_template('upload_files.html')


if __name__ == '__main__':
    app.run()